package UiLag;
import java.util.Scanner;
import KontrolLag.*;
import ModelLag.*;
import java.io.IOException;
import java.util.InputMismatchException;
import java.lang.Exception.*;

/**
 * Klasse som håndterer alt omkring lagerUI
 */
public class LagerUI
{
    private VareCtr vareCtr;
    private static LagerUI instance;
    private PersonCtr personCtr;

    /**
     * Construktor til klassen LagerUI
     */
    private LagerUI()
    {
        vareCtr = VareCtr.getInstance();
        personCtr = PersonCtr.getInstance();

    }

    /**
     * singleton
     */
    public static LagerUI getInstance()
    {
        if(instance == null)
        {
            instance = new LagerUI();
        }
        return instance;
    }
    
    /**
     * metode som starter menuen til UI
     */
    public void start()
    {

        LagerMenu();
    }

    /**
     * metode som koerer menuen til lageret. 
     */
    public void LagerMenu()
    {
        boolean exit = false;
        while(!exit)
        {
            int choise = writePersonMenu();
            if(choise == 1)
            {
                try
                {
                    printVare();
                }
                catch(IndexOutOfBoundsException i)
                {
                    System.out.println("Der eksistere ikke en vare med det EAN nr");
                    stop();
                }
                catch(NullPointerException ne)
                {
                    System.out.println("Der kunne ikke findes en varer med det ean nummer");
                    stop();
                }

            }
            else
            {
                if(choise == 2)
                {
                    try
                    {
                        opretVare();
                    }
                    catch(InputMismatchException i)
                    {
                        System.out.println("Du har indtastet bogstaver, hvor der forventes kun at skulle vaere tal");
                        stop();
                    }
                    catch(NullPointerException np)
                    {
                        System.out.println(" Telefon nummeret tilhoerer ikke en leverandoer");
                        stop();
                    }

                }
                else
                {
                    if(choise == 3)
                    {
                        try
                        {
                            setAntal();
                        }
                        catch(IndexOutOfBoundsException i)
                        {
                            System.out.println("Den indtastede vare findes ikke, og kan derfor ikke slettes");
                            stop();
                        }
                    }
                    else
                    {
                        if(choise == 4)
                        {
                            try
                            {
                                opdaterVare();
                            }

                            catch(IndexOutOfBoundsException i)
                            {
                                System.out.println("Den indtastede vare findes ikke");
                                stop();
                            }
                            catch(NullPointerException ne)
                            {
                                System.out.println("Denne varer kunne ikke findes");
                                stop();
                            }

                        }
                        else
                        {
                            if(choise == 5)
                            {
                                try
                                {
                                    vareCtr.sletVare(inputEanNr());
                                }
                                catch(IndexOutOfBoundsException i)
                                {
                                    System.out.println("Den indtastede vare findes ikke, og kan derfor ikke slettes");
                                    stop();
                                }
                            }
                            else
                            {
                                if(choise == 6)
                                {
                                    tjekHeleLager();
                                }
                                else
                                {
                                    exit = true;

                                }
                            }
                        }
                    }
                }
            }

        }
    }

    /**
     * metode som udskriver muligheder i menuen til lagerUI
     */
    public int writePersonMenu()
    {      // makes an object keyboard to read input from the screen
        Scanner keyboard = new Scanner(System.in);
        System.out.println("\f *** Lager Menu ***");
        System.out.println(" (1) Vis information om en Vare");
        System.out.println(" (2) Tilfoej en ny vare");
        System.out.println(" (3) Opdater antal på en vare");
        System.out.println(" (4) Opdater en vare");
        System.out.println(" (5) Slet en vare");
        System.out.println(" (6) Tjek lageret for vare beholdning");
        System.out.println(" (7) Tilbage");
        System.out.print("\n foretag et valg:");

        int choise = keyboard.nextInt();
        return choise;
    }

    /**
     * metode som udskriver information omkring det produkt man indtaster eanNr til.
     */
    public void printVare()
    {
        Vare v = vareCtr.findVare(inputEanNr());
        System.out.println(" Varens beskrivelse: "+ v.getBeskrivelse());
        System.out.println("Antal af varen: " + v.getAntal());
        System.out.println("Varens bestiling nummer: " + v.getBestilNr());
        System.out.println("Varens EAN nummer: "+ v.getEanNr());
        System.out.println("Indkoebsprisen pr. stk: "+ v.getIndkoebsPris());
        System.out.println("Hvor varen befinder sig henne: "+ v.getLokation());
        System.out.println("Max antal af hvor mange der må vaere af denne vare på lager: "+ v.getMaxLager());
        System.out.println("Minimum antal af hvor mange af denne vare der må vaere på lager: "+ v.getMinLager());
        System.out.println("Salgsprisen for denne vare pr. stk: "+ v.getSalgsPris());
        stop();

    }

        /**
     * Metode som tager input til eanNr og retunerer dette
     * @returns eanNr 
     */
    public String inputEanNr()
    {
        // makes an object keyboard to have input from the screen
        Scanner keyboard = new Scanner(System.in);  
        System.out.println("\n Tilfoej et ean nummer:  ");
        String code = keyboard.nextLine();
        return code;
    }

        /**
     * Metode som tager input til beskrivelse og retunerer dette
     * @returns beskrivelse 
     */
    public String inputBeskrivelse()
    {
        // makes an object keyboard to have input from the screen
        Scanner keyboard = new Scanner(System.in);  
        System.out.println("\n Tilfoej en beskrivelse af varen:  ");
        String code = keyboard.nextLine();
        return code;
    }

        /**
     * Metode som tager input til bestilNr og retunerer dette
     * @returns bestilNr 
     */
    public String inputBestilNr()
    {
        // makes an object keyboard to have input from the screen
        Scanner keyboard = new Scanner(System.in);  
        System.out.println("\n Tilfoej varens bestilings nr:  ");
        String code = keyboard.nextLine();
        return code;
    }

        /**
     * Metode som tager input til indkoebsPris og retunerer dette
     * @returns indkoebsPris 
     */
    public long inputIndkoebsPris()
    {
        // creates an object keyboard to read data from the keyboard
        Scanner keyboard = new Scanner(System.in);
        System.out.println("\n Indtast varens indkoebs pris pr stk: ");
        long no = keyboard.nextInt();
        return no;
    }

        /**
     * Metode som tager input til salgsPris og retunerer dette
     * @returns salgsPris 
     */
    public long inputSalgsPris()
    {
        // creates an object keyboard to read data from the keyboard
        Scanner keyboard = new Scanner(System.in);
        System.out.println("\n Indtast varens salgs pris pr stk: ");
        long no = keyboard.nextInt();
        return no;
    }

        /**
     * Metode som tager input til lokation og retunerer dette
     * @returns lokation 
     */
    public String inputLokation()
    {
        // makes an object keyboard to have input from the screen
        Scanner keyboard = new Scanner(System.in);  
        System.out.println("\n Indtast hvor varen befinder sig:  ");
        String code = keyboard.nextLine();
        return code;
    }

        /**
     * Metode som tager input til minLager og retunerer dette
     * @returns minLager 
     */
    public long inputMinLager()
    {
        // makes an object keyboard to have input from the screen
        Scanner keyboard = new Scanner(System.in);  
        System.out.println("\n Indtast hvor lidt af varen der må vaere på lager:  ");
        long code = keyboard.nextInt();
        return code;
    }

        /**
     * Metode som tager input til maxLager og retunerer dette
     * @returns maxLager 
     */
    public long inputMaxLager()
    {
        // makes an object keyboard to have input from the screen
        Scanner keyboard = new Scanner(System.in);  
        System.out.println("\n Indtast hvor mange af varen der max må vaere på lager:  ");
        long code = keyboard.nextInt();
        return code;
    }

        /**
     * Metode som tager input til antal og retunerer dette
     * @returns antal 
     */
    public long inputAntal()
    {
        // creates an object keyboard to read data from the keyboard
        Scanner keyboard = new Scanner(System.in);
        System.out.println("\n Indtast varens Antal på lager: ");
        long no = keyboard.nextInt();
        return no;
    }

        /**
     * Metode som tager input til tlfNr og retunerer dette
     * @returns tlfNr 
     */
    public String inputPhone()
    {
        // makes an object keyboard to have input from the screen
        Scanner keyboard = new Scanner(System.in);  
        System.out.println("\n Indtast telefon nummer på leverandoeren: ");
        String phone = keyboard.nextLine();
        return phone;
    } 

    /**
     * metode som aendrer antal på den vare der bliver fundet på eanNr
     */
    public void setAntal()
    {
        Vare v = vareCtr.findVare(inputEanNr());
        v.setAntal(v.getAntal() + inputAntal());
    }

    /**
     * metode som opdaterer alle vaerdier på en vare.
     */
    public void opdaterVare()
    {
        Vare v = vareCtr.findVare(inputEanNr());
        v.setBeskrivelse(inputBeskrivelse());
        v.setBestilNr(inputBestilNr());
        v.setEanNr(inputEanNr());
        v.setIndkoebspris(inputIndkoebsPris());
        v.setLokation(inputLokation());
        v.setMaxLager(inputMaxLager());
        v.setMinLager(inputMinLager());
        v.setSalgsPris(inputSalgsPris());
    }

    /**
     * metode som finder en vare ud fra angivet eanNr og retunerer dette.
     * @returns Vare
     */
    public Vare findVare(String eanNr)
    {
        eanNr = inputEanNr();
        Vare v = vareCtr.findVare(eanNr);
        return v;
    }

    /**
     * Metode som forespoerger på alle vaerdier til objektet Vare og opretter en ny Vare med disse.
     */
    public void opretVare()
    {

        try
        {
            vareCtr.opretVare(inputBeskrivelse(), inputEanNr(),inputBestilNr(), inputIndkoebsPris(), inputSalgsPris(), inputLokation(), inputMinLager(), inputMaxLager(), inputAntal(), inputPhone());
            System.out.println("Varen var oprettet");
            stop();
        }
        catch(IndexOutOfBoundsException e)
        {
            System.out.println("Det intastede telefon nummer, findes ikke");
            stop();
        }
        catch(IllegalStateException i)
        {
            System.out.println("Telefon nummeret tilhoerer ikke en leverandoer");
            stop();
        }
        catch(Exception e)
        {
            System.out.print(e);
            stop();
        }
    }

    /**
     * Metode som udskriver beskrivelse, min beholdning og max beholdning for Vare som er under min beholdning.
     */
    public void tjekHeleLager()
    {
        for(Vare v : vareCtr.tjekHeleLager())
        {
            System.out.println("");
            System.out.println(v.getBeskrivelse()+ " er under minimums beholdning");
            System.out.println("Nuvaerende antal"+"      min. lager beholdning"+"      max. lager beholdning");
            System.out.println("     "+ v.getAntal() + "                  " + v.getMinLager() + "                     "+v.getMaxLager());
        }
        stop();
    }

    /**
     * metode som pauser programmet indtil man taster "enter" på tastaturet
     */
    public void stop()
    {
        System.out.println("\n Tryk enter for at gå tilbage");
        Scanner keyboard = new Scanner(System.in);
        keyboard.nextLine();
    }

}
